home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / lib / yotpin / src / zigzag.c < prev   
Encoding:
C/C++ Source or Header  |  1995-08-20  |  3.4 KB  |  173 lines

  1. /*
  2. *    Yamana's Otomeza Taiou Tool
  3. *        ジグザグ
  4. *    
  5. *    1995.08.06
  6. *    
  7. */
  8. #include    "otome_pi.h"
  9.  
  10. const char longname[] = "DRAW  : ジグザグ四角";
  11. int            cnfg_max = 1;
  12. PI_CNFG        cnfg[] =
  13.             {    /* 1234567890123456 ,min,max,def,set */
  14.                 { "ジグザグ大きさ"    ,  2, 16,  8,  8 },
  15.             };
  16.  
  17. #define    USE_ENV     PI_SET_ENV
  18. #define    USE_TYPE    PI_DRAW_BOXF
  19.  
  20. #include    "otome_pi.c"
  21.  
  22.  
  23. /********************************/
  24.  
  25. int ZigZagBox( fr,wd )
  26. FRAME    *fr;
  27. int     wd;
  28. {
  29.     int     i;
  30.     int     lx,ly;
  31.     char    *mem,*h0,*h1,*v0,*v1;
  32.     int     ph,pv;
  33.     
  34.     lx = ( fr->rdwx - fr->lupx + 1 )/ (wd*2) ;    /* 周期の数 */
  35.     ly = ( fr->rdwy - fr->lupy + 1 )/ (wd*2) ;
  36.     
  37.     if( lx<2 || ly<2 )    return NOERR;
  38.     
  39.     ph = lx*2;        /* 点の数 */
  40.     pv = ly*2;
  41.     if( (mem = PI_MALLOC( (ph+pv+1)*4*2 ))==NULL )
  42.         return ERROR;
  43.     
  44.     h0 = mem ;                    /* ┌── ┐ */
  45.     h1 = h0 + ph*4+2;            /*        │ */
  46.     v0 = h1 + ph*4+2;            /* │        */
  47.     v1 = v0 + pv*4+2;            /* └ ──┘ */
  48.     
  49.     WORD( h0 ) = WORD( h1 ) = ph;
  50.     WORD( v0 ) = WORD( v1 ) = pv;
  51.     
  52.     for( i=0; i<ph ;i++ )
  53.     {
  54.         WORD( h0+2+i*4 ) = fr->lupx + wd*i ;
  55.         WORD( h0+4+i*4 ) = fr->lupy + wd - (i & 1)*wd ;
  56.         
  57.         WORD( h1+2+i*4 ) = fr->lupx + wd*(i+1) ;
  58.         WORD( h1+4+i*4 ) = fr->lupy + wd*ly*2 - (i & 1)*wd ;
  59.     }
  60.     for( i=0; i<pv ;i++ )
  61.     {
  62.         WORD( v0+2+i*4 ) = fr->lupx + (i & 1)*wd ;
  63.         WORD( v0+4+i*4 ) = fr->lupy + wd*(i+1) ;
  64.         
  65.         WORD( v1+2+i*4 ) = fr->lupx + wd*lx*2 - wd + (i & 1)*wd ;
  66.         WORD( v1+4+i*4 ) = fr->lupy + wd*i ;
  67.     }
  68.     
  69.     EGB_connect( EgbPtr, h0 );
  70.     EGB_connect( EgbPtr, h1 );
  71.     EGB_connect( EgbPtr, v0 );
  72.     EGB_connect( EgbPtr, v1 );
  73.     
  74.     PI_FREE( mem );
  75.     return NOERR;
  76. }
  77.  
  78. /********************************/
  79. #if 0
  80.  
  81. int get_fr( fr, wd )
  82. FRAME    *fr;
  83. int     wd;
  84. {
  85.     char    *MosPtr;
  86.     int     ch,mx,my,ox,oy;
  87.     int     ex,ey;
  88.     int     cancel = 0;
  89.     
  90.     if( (MosPtr = PI_MALLOC( MosWorkSize ))==NULL )
  91.         return PI_ERROR_NO_MEMORY;
  92.     
  93.     MOS_rdpos( &ch, &mx, &my );
  94.     MOS_start( MosPtr,  MosWorkSize );
  95.     MOS_setpos( mx,my );
  96.     
  97.     EGB_writePage( EgbPtr, EGB_getWritePage(0,0) );
  98.     EGB_writeMode( EgbPtr, EGB_XOR );
  99.     EGB_paintMode( EgbPtr, 0x02 );
  100.     EGB_color     ( EgbPtr, EGB_FORECOL, -1 );
  101.     
  102.     fr->lupx = fr->rdwx = mx;
  103.     fr->lupy = fr->rdwy = my;
  104.     EGB_rectangle( EgbPtr, fr );
  105.     
  106.     do
  107.     {    MOS_rdpos( &ch, &mx, &my );
  108.     }while( ch & MOS_LEFT );
  109.     
  110.     ex = fr->lupx;
  111.     ey = fr->lupy;
  112.     while( 1 )
  113.     {
  114.         do
  115.         {    ox=mx,oy=my;
  116.             MOS_rdpos( &ch, &mx, &my );
  117.             
  118.         }while( ch==0 && ox==mx && oy==my );
  119.         
  120.         if( ch & 3 )    break;
  121.         if( abs(mx - ex)<wd || abs(my - ey)<wd )
  122.             continue;
  123.         
  124.         EGB_rectangle( EgbPtr, fr );
  125.         
  126.         ex = fr->lupx + (mx - fr->lupx)/wd*wd ;
  127.         ey = fr->lupy + (my - fr->lupy)/wd*wd ;
  128.         
  129.         fr->rdwx = ex;
  130.         fr->rdwy = ey;
  131.         EGB_rectangle( EgbPtr, fr );
  132.         
  133.     }
  134.     EGB_rectangle( EgbPtr, fr );
  135.     
  136.     if( ch & MOS_RIGHT )    cancel = 1;
  137.     do
  138.     {    MOS_rdpos( &ch, &mx, &my );
  139.     }while( ch & 3 );
  140.     
  141.     MOS_end();
  142.     PI_FREE( MosPtr );
  143.     
  144.     return cancel;
  145. }
  146. #endif
  147.  
  148.  
  149. int APL_exec()
  150. {
  151.     int     width,tmp;
  152.     
  153.     width= cnfg[0].val;        /* ジグザグの幅 */
  154.     
  155. /*
  156.     if( get_fr( &fr, width ) )
  157.         return NOERR;
  158.     if( fr.lupx > fr.rdwx )    tmp=fr.lupx, fr.lupx=fr.rdwx, fr.rdwx=tmp;
  159.     if( fr.lupy > fr.rdwy )    tmp=fr.lupy, fr.lupy=fr.rdwy, fr.rdwy=tmp;
  160. */
  161.     EGB_writePage( EgbPtr, pi_imge->page );
  162.     EGB_writeMode( EgbPtr, EGB_PSET );
  163.     EGB_paintMode( EgbPtr, 0x02 );
  164.     EGB_color     ( EgbPtr, EGB_FORECOL, pi_data->fore_color);
  165.     
  166.     if( ZigZagBox( (FRAME*)pi_para->gpara, width ) )
  167.         return ERROR;
  168.     
  169.     memcpy( ret_fr, pi_para->gpara, sizeof(FRAME) );
  170.     
  171.     return NOERR;
  172. }
  173.